const express = require('express')
const app = express()
const bodyParser = require('body-parser');
// 跨域中间件
const cors = require('cors')
app.use(express.json())
app.use(cors())

// 解析表单数据的中间件
// app.use(express.urlencoded({ urlencoded: false }))
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))
// 托管静态资源文件
app.use('/uploads', express.static('./uploads'))

// 在路由之前封装一个 res.cc 函数  全局中间件
app.use((req, res, next) => {
    // status 默认值为1，表示失败的情况
    // err 的值，可能是一个错误对象，也有可能是一个 错误的描述字符串
    res.cc = (err, status =1) => {
        res.send({
            status,
            message : err instanceof Error ? err.message : err  
        })
    }
    next()
})

// 导入路由之前配置解析 token 的中间件
const expressJWT = require('express-jwt')
const config = require('./utils/config')
// 使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 Token 的身份认证| 只要是api或order开头的就需要token
app.use(expressJWT({ secret : config.jwtSecreKey }).unless({ path : [/^(?!\/api|\/order|\/maintainer|\/admin).*/]}))
//  

// /^\/[^api] | ^\/[^order]/

const userRouter = require('./router/user')
app.use('/user', userRouter)

const userInfoRouter = require('./router/userInfo')
app.use('/api', userInfoRouter)

const repairRouter = require('./router/repair')
app.use('/repair', repairRouter)

const orderRouter = require('./router/order')
app.use('/order', orderRouter)

const maintainerRouter = require('./router/maintainer')
app.use('/maintainer', maintainerRouter)

const adminRouter = require('./router/admin')
app.use('/admin', adminRouter)

// 定义错误级别的中间件
app.use((err, req, res, next) => {
    // if(err) return res.cc(err)
     // 捕获身份认证失败的错误
    if (err.name === 'UnauthorizedError') return res.cc('身份认证失败')

    // 未知错误
    res.cc(err.message)
})

app.listen(3007, ()=>{
    console.log('serve runing http://127.0.0.1:3007')
})